<?php
/**
* La classe abstraite Abstractltem hérite de la class AbstractPublishableltem et implemente l'interface Taggable. 
* Elle poséde donc leurs méthodes :
*
* 1) getPublicationDate qui ne prend aucun paramètre et retourne une valeur de type int .
*
* 2) getAuthor qui ne prend aucun paramètre et retourne une valeur de type string .
*
* 3) addTag qui prend en paramètre une valeur de type string.
*
* 4) removeTag  qui prend en paramètre une valeur de type string.
*
* 5) tagCount qui ne prend aucun paramètre et retourne un type int
*
* 6) getTags qui ne prend aucun paramètre dont le type de retour est une liste de string  (List<String>)
*
* En plus de ces méthodes, elle possède un constructeur qui hérite de celui de AbstractPublishableltem.
* Qui prend donc en paramétre une date de publication au format int, un nom d'auteur au format string une liste de tag au format string ainsi qu'un contenu au format string .
*
*
* Les variable:
* $PublicationDate stocke la date de publication au format int.
*
* $PublicationAuthor stocke le nom de l'auteur au format string.
*
* $listTags stocke la liste de tag au format string.
*
* $content stocke le contenu au format string.
*
* $n_tag stocke le nombre de tag au format int.
*
* $Tag stocke les tags dans un tableau de string.
*/
abstract  class Abstractltem extends AbstractPublishableltem implements Taggable{

	private $listTags;
	private $content;
    private $n_tag;
    private $Tag;

    public function __construct ($_PublicationDate, $_PublicationAuthor, $_listTags , $_content= " ") {
        parent::__construct($_PublicationDate, $_PublicationAuthor);
		$this->Tag=explode(" ", $_listTags);
		$this->content=$_content;
	}
    
    // réalidsation de l'interface Taggable
    public function getContent(){
        /**
        * getContent() ne prend aucun paramètre et retourne une valeur de type string correspondant au contenu de publication.
        */
        return $this->content;
        }
    
     public function addTag($tag) {
	$this->Tag[$this->n_tag]=$tag;
	$this->n_tag++; 
         /**
        *  addTag() prend en paramètre une valeur de type string et l'ajoute à la liste des tag de la publication.
        */
   }

    public function removeTag($indice_tag) {
        unset($this->Tag[$indice_tag]);
        $this->list_tag=implode(" ", $this->Tag);
        $this->n_tag--;
        /**
        *  removeTag() prend en paramètre une valeur de type string et la supprime de la liste des tags de la publication.
        */
    }
public function tagCount(){
        /**
        * tagCount() ne prend aucun paramètre et retourne un type int qui est le nombre de tag de la publication
        */    
        return $this->n_tag=count($this->Tag);
    }
    public function getTags(){
        /**
        * getTags() ne prend aucun paramètre et retourne un type string qui est la liste des tags de la publication
        */          
        return $this->list_tag=implode(" ", $this->Tag);
        }
    
    
}
